<?php

class AjaxController extends AdminController
{
    // 选择上传文件
    public function selectUploadAction()
    {
        $input = $this->get('input');
        $number = $this->get('number');
        $type = $this->get('type');

        $this->view->assign('input', $input);
        $this->view->assign('number', $number);
        $this->view->assign('type', $type);
    }

    public function ueuploadAction()
    {
        Yaf_Dispatcher::getInstance()->disableView();
        $CONFIG = array(
            /* 上传图片配置项 */
            "imageActionName" => "uploadimage",
            /* 执行上传图片的action名称 */
            "imageFieldName" => "upfile",
            /* 提交的图片表单名称 */
            "imageMaxSize" => 2048000,
            /* 上传大小限制，单位B */
            "imageAllowFiles" => array(
                ".png",
                ".jpg",
                ".jpeg",
                ".gif",
                ".bmp"
            ),
            /* 上传图片格式显示 */
            "imageCompressEnable" => true,
            /* 是否压缩图片,默认是true */
            "imageCompressBorder" => 1600,
            /* 图片压缩最长边限制 */
            "imageInsertAlign" => "none",
            /* 插入的图片浮动方式 */
            "imageUrlPrefix" => "",
            /* 图片访问路径前缀 */
            "imagePathFormat" => "/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}",
            /* 涂鸦图片上传配置项 */
            "scrawlActionName" => "uploadscrawl",
            /* 执行上传涂鸦的action名称 */
            "scrawlFieldName" => "upfile",
            /* 提交的图片表单名称 */
            "scrawlPathFormat" => "/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}",
            /* 上传保存路径,可以自定义保存路径和文件名格式 */
            "scrawlMaxSize" => 2048000,
            /* 上传大小限制，单位B */
            "scrawlUrlPrefix" => "",
            /* 图片访问路径前缀 */
            "scrawlInsertAlign" => "none",
            /* 截图工具上传 */
            "snapscreenActionName" => "uploadimage",
            /* 执行上传截图的action名称 */
            "snapscreenPathFormat" => "/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}",
            /* 上传保存路径,可以自定义保存路径和文件名格式 */
            "snapscreenUrlPrefix" => "",
            /* 图片访问路径前缀 */
            "snapscreenInsertAlign" => "none",
            /* 插入的图片浮动方式 */

            /* 抓取远程图片配置 */
            "catcherLocalDomain" => array(
                "127.0.0.1",
                "localhost",
                "img.baidu.com"
            ),
            "catcherActionName" => "catchimage",
            /* 执行抓取远程图片的action名称 */
            "catcherFieldName" => "source",
            /* 提交的图片列表表单名称 */
            "catcherPathFormat" => "/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}",
            /* 上传保存路径,可以自定义保存路径和文件名格式 */
            "catcherUrlPrefix" => "",
            /* 图片访问路径前缀 */
            "catcherMaxSize" => 2048000,
            /* 上传大小限制，单位B */
            "catcherAllowFiles" => array(
                ".png",
                ".jpg", ".jpeg", ".gif",
                ".bmp"
            ),
            /* 抓取图片格式显示 */

            /* 上传视频配置 */
            "videoActionName" => "uploadvideo",
            /* 执行上传视频的action名称 */
            "videoFieldName" => "upfile",
            /* 提交的视频表单名称 */
            "videoPathFormat" => "/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}",
            /* 上传保存路径,可以自定义保存路径和文件名格式 */
            "videoUrlPrefix" => "",
            /* 视频访问路径前缀 */
            "videoMaxSize" => 102400000,
            /* 上传大小限制，单位B，默认100MB */
            "videoAllowFiles" => array(
                ".flv", ".swf",
                ".mkv", ".avi", ".rm", ".rmvb", ".mpeg",
                ".mpg", ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"
            ),
            /* 上传视频格式显示 */

            /* 上传文件配置 */
            "fileActionName" => "uploadfile",
            /* controller里,执行上传视频的action名称 */
            "fileFieldName" => "upfile",
            /* 提交的文件表单名称 */
            "filePathFormat" => "/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}",
            /* 上传保存路径,可以自定义保存路径和文件名格式 */
            "fileUrlPrefix" => "",
            /* 文件访问路径前缀 */
            "fileMaxSize" => 51200000,
            /* 上传大小限制，单位B，默认50MB */
            "fileAllowFiles" => array(
                ".png",
                ".jpg",
                ".jpeg",
                ".gif",
                ".bmp",
                ".flv",
                ".swf",
                ".mkv",
                ".avi",
                ".rm",
                ".rmvb",
                ".mpeg",
                ".mpg",
                ".ogg",
                ".ogv",
                ".mov",
                ".wmv",
                ".mp4",
                ".webm",
                ".mp3",
                ".wav",
                ".mid",
                ".rar",
                ".zip",
                ".tar",
                ".gz",
                ".7z",
                ".bz2",
                ".cab",
                ".iso",
                ".doc",
                ".docx",
                ".xls",
                ".xlsx",
                ".ppt",
                ".pptx",
                ".pdf",
                ".txt",
                ".md",
                ".xml"
            ),
            /* 上传文件格式显示 */

            /* 列出指定目录下的图片 */
            "imageManagerActionName" => "listimage",
            /* 执行图片管理的action名称 */
            "imageManagerListPath" => "/upload/image/",
            /* 指定要列出图片的目录 */
            "imageManagerListSize" => 20,
            /* 每次列出文件数量 */
            "imageManagerUrlPrefix" => "",
            /* 图片访问路径前缀 */
            "imageManagerInsertAlign" => "none",
            /* 插入的图片浮动方式 */
            "imageManagerAllowFiles" => array(
                ".png",
                ".jpg",
                ".jpeg",
                ".gif",
                ".bmp"
            ),
            /* 列出的文件类型 */

            /* 列出指定目录下的文件 */
            "fileManagerActionName" => "listfile",
            /* 执行文件管理的action名称 */
            "fileManagerListPath" => "/upload/file/",
            /* 指定要列出文件的目录 */
            "fileManagerUrlPrefix" => "",
            /* 文件访问路径前缀 */
            "fileManagerListSize" => 20,
            /* 每次列出文件数量 */
            "fileManagerAllowFiles" => array(
                ".png",
                ".jpg",
                ".jpeg",
                ".gif",
                ".bmp",
                ".flv",
                ".swf",
                ".mkv",
                ".avi",
                ".rm",
                ".rmvb",
                ".mpeg",
                ".mpg",
                ".ogg",
                ".ogv",
                ".mov",
                ".wmv",
                ".mp4",
                ".webm",
                ".mp3",
                ".wav",
                ".mid",
                ".rar", ".zip",
                ".tar",
                ".gz", ".7z",
                ".bz2",
                ".cab",
                ".iso", ".doc",
                ".docx",
                ".xls",
                ".xlsx", ".ppt",
                ".pptx",
                ".pdf",
                ".txt",
                ".md",
                ".xml"
            )
        );
        header("Content-Type: text/html; charset=utf-8");
        $action = $_GET['action'];

        switch ($action) {
            case 'config':
                $result = json_encode($CONFIG);
                break;
            /* 上传图片 */
            case 'uploadimage':
                /* 上传涂鸦 */
            case 'uploadscrawl':
                /* 上传视频 */
            case 'uploadvideo':
                /* 上传文件 */
            case 'uploadfile':
                /* 上传配置 */
                $base64 = "upload";
                switch (htmlspecialchars($_GET['action'])) {
                    case 'uploadimage':
                        $config = array(
                            "pathFormat" => $CONFIG['imagePathFormat'],
                            "maxSize" => $CONFIG['imageMaxSize'],
                            "allowFiles" => $CONFIG['imageAllowFiles']
                        );
                        $fieldName = $CONFIG['imageFieldName'];
                        break;
                    case 'uploadscrawl':
                        $config = array(
                            "pathFormat" => $CONFIG['scrawlPathFormat'],
                            "maxSize" => $CONFIG['scrawlMaxSize'],
                            "allowFiles" => $CONFIG['scrawlAllowFiles'],
                            "oriName" => "scrawl.png"
                        );
                        $fieldName = $CONFIG['scrawlFieldName'];
                        $base64 = "base64";
                        break;
                    case 'uploadvideo':
                        $config = array(
                            "pathFormat" => $CONFIG['videoPathFormat'],
                            "maxSize" => $CONFIG['videoMaxSize'],
                            "allowFiles" => $CONFIG['videoAllowFiles']
                        );
                        $fieldName = $CONFIG['videoFieldName'];
                        break;
                    case 'uploadfile':
                    default:
                        $config = array(
                            "pathFormat" => $CONFIG['filePathFormat'],
                            "maxSize" => $CONFIG['fileMaxSize'],
                            "allowFiles" => $CONFIG['fileAllowFiles']
                        );
                        $fieldName = $CONFIG['fileFieldName'];
                        break;
                }

                /* 生成上传实例对象并完成上传 */
                $up = new Ueuploader($fieldName, $config, $base64);

                /**
                 * 得到上传文件所对应的各个参数,数组结构
                 * array(
                 *     "state" => "",          //上传状态，上传成功时必须返回"SUCCESS"
                 *     "url" => "",            //返回的地址
                 *     "title" => "",          //新文件名
                 *     "original" => "",       //原始文件名
                 *     "type" => ""            //文件类型
                 *     "size" => "",           //文件大小
                 * )
                 */
//                $data = $up->getFileInfo();
//                if ($data['state'] == 'SUCCESS'){
//                    model_admin_uploads::create(array(
//                        'file_name'=>$data['title'],
//                        'file_url'=>$data['url'],
//                        'file_size'=>$data['size'],
//                        'create_time'=>time(),
//                    ));
//                }
                /* 返回数据 */
                $result = json_encode($up->getFileInfo());
                break;
            /* 列出图片 */
            case 'listimage':
                /* 列出文件 */
            case 'listfile':
                /* 判断类型 */
                switch ($_GET['action']) {
                    /* 列出文件 */
                    case 'listfile':
                        $allowFiles = $CONFIG['fileManagerAllowFiles'];
                        $listSize = $CONFIG['fileManagerListSize'];
                        $path = $CONFIG['fileManagerListPath'];
                        break;
                    /* 列出图片 */
                    case 'listimage':
                    default:
                        $allowFiles = $CONFIG['imageManagerAllowFiles'];
                        $listSize = $CONFIG['imageManagerListSize'];
                        $path = $CONFIG['imageManagerListPath'];
                }
                $allowFiles = substr(str_replace(".", "|", join("", $allowFiles)), 1);

                /* 获取参数 */
                $size = isset($_GET['size']) ? htmlspecialchars($_GET['size']) : $listSize;
                $start = isset($_GET['start']) ? htmlspecialchars($_GET['start']) : 0;
                $end = $start + $size;

                /* 获取文件列表 */
                $path = $_SERVER['DOCUMENT_ROOT'] . (substr($path, 0, 1) == "/" ? "" : "/") . $path;
                $files = Ueuploader::getfiles($path, $allowFiles);
                krsort($files);
                if (!count($files)) {
                    return json_encode(array(
                        "state" => "no match file",
                        "list" => array(),
                        "start" => $start,
                        "total" => count($files)
                    ));
                }
                /* 获取指定范围的列表
                $len = count($files);
                for ($i = min($end, $len) - 1, $list = array(); $i < $len && $i >= 0 && $i >= $start; $i--) {
                    $list[] = $files[$i];
                }
                //倒序
                //for ($i = $end, $list = array(); $i < $len && $i < $end; $i++){
                //    $list[] = $files[$i];
                //}
                /* 返回数据 */
                $result = json_encode(array(
                    "state" => "SUCCESS",
                    "list" => array_values($files),
                    "start" => $start,
                    "total" => count($files)
                ));
                break;
            /* 抓取远程文件 */
            case 'catchimage':
                /* 上传配置 */
                $config = array(
                    "pathFormat" => $CONFIG['catcherPathFormat'],
                    "maxSize" => $CONFIG['catcherMaxSize'],
                    "allowFiles" => $CONFIG['catcherAllowFiles'],
                    "oriName" => "remote.png"
                );
                $fieldName = $CONFIG['catcherFieldName'];

                /* 抓取远程图片 */
                $list = array();
                if (isset($_POST[$fieldName])) {
                    $source = $_POST[$fieldName];
                } else {
                    $source = $_GET[$fieldName];
                }
                foreach ($source as $imgUrl) {
                    $item = new Ueuploader($imgUrl, $config, "remote");
                    $info = $item->getFileInfo();
                    array_push($list, array(
                        "state" => $info["state"],
                        "url" => $info["url"],
                        "size" => $info["size"],
                        "title" => htmlspecialchars($info["title"]),
                        "original" => htmlspecialchars($info["original"]),
                        "source" => htmlspecialchars($imgUrl)
                    ));
                }

                /* 返回抓取数据 */
                $result = json_encode(array(
                    'state' => count($list) ? 'SUCCESS' : 'ERROR',
                    'list' => $list
                ));
                break;
            default:
                $result = json_encode(array(
                    'state' => '请求地址出错'
                ));
                break;
        }

        /* 输出结果 */
        if (isset($_GET["callback"])) {
            if (preg_match("/^[\w_]+$/", $_GET["callback"])) {
                echo htmlspecialchars($_GET["callback"]) . '(' . $result . ')';
            } else {
                echo json_encode(array(
                    'state' => 'callback参数不合法'
                ));
            }
        } else {
            echo $result;
        }
    }
}